home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Freeware 2001 May
/
SGI Freeware 2001 May - Disc 1.iso
/
dist
/
patchSG0003743.idb
/
usr
/
include
/
cray
/
assign.h.z
/
assign.h
Wrap
C/C++ Source or Header
|
2001-04-12
|
19KB
|
633 lines
/* USMID @(#) clibinc/cray/assign.h 92.2 12/18/98 09:49:04 */
/*
* (C) COPYRIGHT CRAY RESEARCH, INC.
* UNPUBLISHED PROPRIETARY INFORMATION.
* ALL RIGHTS RESERVED.
*/
#ifndef _CRAY_ASSIGN_H
#define _CRAY_ASSIGN_H
#ifndef _LIB_INTERNAL
#define _LIB_INTERNAL 1 /* expose internal FFIO definitions */
#endif
#include <ffio.h>
#include <liberrno.h>
#include <stddef.h>
#include <stdio.h>
#include <cray/fortio.h>
#include <cray/mtlock.h>
#include <sys/param.h>
/************************************************************************
* *
* CONSTANTS *
* *
************************************************************************/
/*
* Assign option values.
*/
#define AS_SKIPBAD 1 /* -d skipbad */
#define AS_ACPTBAD 2 /* -d acptbad */
#define AS_FORTRAN77 1 /* -f 77 */
#define AS_FORTRAN90 2 /* -f 90 */
#define AS_IRIX_F77 3 /* -f irixf77 */
#define AS_IRIX_F90 4 /* -f irixf90 */
#define AS_THREAD 1 /* -P thread */
#define AS_PROCESS 2 /* -P process */
#define AS_TEAM 3 /* -P team */
#define AS_PRIVATE 4 /* -P private */
#define AS_GLOBAL 5 /* -P global */
/*
* Other constants.
*/
#define BYFILE 'f'
#define BYGLOBAL 'g'
#define BYPATTERN 'p'
#define BYUNIT 'u'
#define MAX_FDC_SPEC 128 /* max words in an FDC specification */
#define MAX_ASSIGN_LINE 5000 /* maximum number of characters in an */
/* assign record. This number must */
/* be comfortably greater than */
/* (PATH_MAX * 4 + MAX_FDC_SPEC) */
/* as long as the hybrid assign env */
/* file format is supported (through */
/* UNICOS 7.0?). After that time, */
/* this constant may be reduced to */
/* (PATH_MAX * 2 + MAX_FDC_SPEC + pad)*/
#define DECIMAL 10 /* for strtol */
#define AE_LIB 1 /* call from assign lib routines */
#define AE_ASSIGN 2 /* call from assign command */
#define AE_ASGCMD 3 /* call from asgcmd command */
/*
* Strings and characters
*/
#define ASSIGN_ENV_VAR "FILENV" /* pointer to assign environment */
#define ASSIGN_OPT_VAR "_LIBASSIGNENV_"/* default asn environment repository */
#define ASGCMD_ENV_VAR "_ASG_ATTR" /* location of asgcmd attributes */
#define PROCENVFLAG '$' /* indicate an environment var name */
#define DELIMSTR " # # " /* delimiter in environment strings */
/*
* Mask bits which identify searches for g:all/sf/su/df/du/aq/ff/mpi
* assign objects.
*/
#define ASN_G_ALL 0001
#define ASN_G_SF 0002
#define ASN_G_SU 0004
#define ASN_G_DF 0010
#define ASN_G_DU 0020
#define ASN_G_AQ 0040
#define ASN_G_FF 0400
#define ASN_G_MPI 01000
/************************************************************************
* *
* MACROS used by internal assign parsing *
* *
************************************************************************/
#define RETERR(_EH,_NUM) { \
_lerror(_EH,_NUM); \
errno = _NUM; \
return(-1); \
}
#define RETERR1(_EH,_NUM,_D1) { \
_lerror(_EH,_NUM,_D1); \
errno = _NUM; \
return(-1); \
}
#define RETERR2(_EH,_NUM,_D1,_D2) { \
_lerror(_EH,_NUM,_D1,_D2); \
errno = _NUM; \
return(-1); \
}
#define ERRET(ee) { errno = ee; return(-1); }
/*
* ASSIGN_LOCK protects multitasked programs when executing in sensitive
* areas in assign library routines. ASSIGN_LOCK must be
* called whenever:
*
* (1) - the assign environment file is open. File updates
* across unrelated processes are forced as
* single-threaded by file locking. For tasks in
* a multitasked group or multiple tasks/PEs on an MPP,
* file locking will not cause one task to wait for a
* lock held by another task. So a multitasking lock
* is needed too.
*
* (non-MPP) (2) - the local assign environment is being accessed.
* The local assign environment is global to all tasks
* and must be accessed by a single task at a time.
* The local assign environment is enabled when ASNCTL
* is called with the 'LOCAL' or 'NEWLOCAL' options.
*
* (non-MPP) (3) - fopen() or fclose() are called for the assign
* environment file. This ensures that updates to
* the __iob table are single threaded. Note that
* (1) implies (3).
*
* ASSIGN_UNLOCK Unlocks the assign library lock.
*/
#ifndef _CRAYMPP
#define ASSIGN_LOCK() MEM_LOCK(&_Ae_assign_lock)
#define ASSIGN_UNLOCK() MEM_UNLOCK(&_Ae_assign_lock)
#else /* _CRAYMPP */
#define ASSIGN_LOCK() { if (_num_pes() > 1) \
MPP_LOCK(&_Ae_assign_lock); }
#define ASSIGN_UNLOCK() { if (_num_pes() > 1) \
MPP_UNLOCK(&_Ae_assign_lock); }
#endif /* _CRAYMPP */
/*
* _AE_SKIPWHITE - skips spaces and tabs.
*/
#define _AE_SKIPWHITE(pp) { \
register char cc; \
cc = *pp; \
while (isspace(cc) && cc != '\0') \
cc = *++pp; \
}
/*
* _AE_NULLINFO - sets an assign_info structure to contain no attributes.
*/
#define _AE_NULLINFO(P) ((void)memset((char*)P,0,sizeof(assign_info)))
/*
* Assign debugging macros. Define DEBUG_ASSIGN to activate these macros.
*/
#ifdef DEBUG_ASSIGN
#define ASN_DEBUG( ARGLIST ) printf ARGLIST
#else
#define ASN_DEBUG( ARGLIST )
#endif
/*
* AFLAGSIZE number of words in the flags part of the assign_info
* structure. Includes flagpad to allow compatibility
* of mismatched libu and libf (in some cases).
*/
#define AFLAGSIZE ((offsetof(assign_info, flagpad) + \
sizeof(((assign_info*) 0)->flagpad)) )
/*
* _ae_opt_control - returns 1 if a letter is a control option
*
* _ae_opt_noptval - returns 1 if a letter is an option which does
* not take an option value
*
* _ae_opt_optval - returns 1 if a letter is an option which takes
* an option value which is not an integer or
* merely "off"/"on".
*/
#define _ae_opt_control(ch) \
((ch)>='A' && (ch)<='z' && _Ae_letters[(ch)-'A'] == 'c')
#define _ae_opt_nooptval(ch) \
((ch)>='A' && (ch)<='z' && _Ae_letters[(ch)-'A'] == 'n')
#define _ae_opt_optval(ch) \
((ch)>='A' && (ch)<='z' && _Ae_letters[(ch)-'A'] == 'v')
/************************************************************************
* *
* STRUCTURE DEFINITIONS *
* *
************************************************************************/
typedef struct {
char type; /* BYUNIT - unit */
/* BYFILE - file name */
/* BYGLOBAL - g:XXX */
/* BYPATTERN - file name pattern */
union {
long unit; /* for assign by unit */
char *str; /* for other types of assign objects */
} u;
} assign_obj_id;
/*
* assign_info - this structure is used for returning assign
* environment information (attributes) for a particular
* assign object to the user.
*
* The *_flg fields have the fillowing flags which
* might be set:
*
* ATTR_SET - attribute is specified
* ATTR_USED - attribute has been used
*
* The ATTR_SET bit is set during assign parsing. The
* ATTR_USED bit is for the convenience of library
* open processing.
*/
enum asn_flags {
ATTR_SET = 1,
ATTR_USED = 2
};
typedef unsigned char aflg_t;
typedef struct assign_info_s {
aflg_t a_actfil_flg;
aflg_t a_sdsfil_flg;
aflg_t b_bufsiz_flg;
aflg_t B_direct_flg;
aflg_t c_contig_flg;
aflg_t C_chrcnv_flg;
aflg_t d_datrcv_flg;
aflg_t D_fildes_flg;
aflg_t f_fortst_flg;
aflg_t F_filter_flg;
aflg_t l_buflev_flg;
aflg_t L_ldraw_flg;
aflg_t m_multup_flg;
aflg_t n_preall_flg;
aflg_t n_stride_flg;
aflg_t N_datcnv_flg;
aflg_t o_UNUSED_flg;
aflg_t P_ioscop_flg;
aflg_t q_ocblks_flg;
aflg_t pr_partit_flg;
aflg_t r_raw_flg;
aflg_t s_fstrct_flg;
aflg_t S_comsep_flg;
aflg_t t_tmpfil_flg;
aflg_t T_utrunc_flg;
aflg_t u_bufcnt_flg;
aflg_t U_unicoslist_flg;
aflg_t w_welfrm_flg;
aflg_t W_compwidth_flg;
aflg_t x_parallel_flg;
aflg_t y_reptcnt_flg;
aflg_t Y_nl_skip_flg;
aflg_t Z_neg_zero_flg;
aflg_t flagpad[9]; /* marker & pad for end of flags */
char a_actfil[PATH_MAX]; /* -a option. */
/* Actual file opened when this */
/* file or unit appears in an OPEN. */
/* -a SDS option. */
/* Indicates SDS file. */
int b_bufsiz; /* -b option. */
/* Requested size of library buffer */
/* in 512-word blocks. */
int B_direct; /* -B option */
/* When == 1, set O_DIRECT on */
/* open(2) system call. */
int c_contig; /* -c option. (this field not used) */
int C_chrcnv; /* -C options. */
/* Character conversion code. */
int d_datrcv; /* -d option. */
/* AR_SKIPBAD or AR_ACPTBAD */
/* Bad data recovery options. */
int D_fildes; /* -D option */
/* Connect to file descriptor */
int f_fortst; /* Fortran 77 or 90 conformancy */
union spec_u /* -F option */
F_filter[MAX_FDC_SPEC]; /* Binary filter specification. */
int F_filter_len; /* Size of the filter spec (in words) */
int l_buflev; /* -l option. */
/* System buffering indicator. */
/* 1 indicates to open file to use */
/* the system I/O buffers. 0 means */
/* open the file in RAW mode. */
int L_ldraw; /* -L option. */
/* When == 1, set O_LDRAW on */
/* open(2) system call. */
int m_multup; /* -m option. */
/* When == 1, a direct access file */
/* may suppress a truncation at */
/* logical size at close time. */
int n_preall; /* -n option. */
/* Pre-allocation size in 512-word */
/* blocks. */
int n_stride; /* -n option. */
/* Pre-allocation stride accross */
/* stripe partitions. Only available */
/* on the YMP. */
int N_datcnv; /* -N options. */
/* Numeric conversion code. */
int o_UNUSED; /* no longer used */
long pr_partit; /* -p option. */
/* Bit mask indicating which */
/* partitions of the file system to */
/* which the system should attempt */
/* to allocate the file. */
int P_ioscop; /* -P option. */
/* When == 'p' Fortran units are */
/* private to a task. When == 'g' */
/* Fortran units are global. */
int q_ocblks; /* -q option. */
/* cblks value for open(2) sys call */
int r_raw; /* -r option. */
/* When == 1, set O_RAW on */
/* open(2) system call. */
int s_fstrct; /* -s option. */
/* File structure code. */
int S_comsep; /* -S option. */
/* Use comma as the list-directed */
/* output separator. Default on */
/* UNICOS. */
int t_tmpfil; /* -t option. (this field not used) */
int T_utrunc; /* -T option. */
/* When == 1, a sequential Fortran */
/* file is truncated after writes. */
int u_bufcnt; /* -u option. */
/* Requested number of library */
/* buffers to use for a direct-access */
/* file. */
int U_unicoslist; /* -U option. */
/* Produce UNICOS form of */
/* list-directed output on irix. */
/* Default on UNICOS. */
/* This includes -S, -W, and -y. */
int w_welfrm; /* -w option. */
/* When == 1, set O_WELLFORMED on */
/* open(2) system call. */
int W_compwidth; /* -W option. */
/* Produce compressed width output */
/* for list-directed output on irix. */
/* Default on UNICOS. */
int x_parallel; /* -x option. */
/* When == 1, set O_PARALLEL on */
/* open(2) system call. */
int y_reptcnt; /* -y option. */
/* Produce repeat counts for */
/* list-directed output on irix. */
/* Default on UNICOS. */
int Y_nl_skip; /* -Y option. */
/* Skip unmatched namelist */
/* group name on input */
/* Default is off. */
int Z_neg_zero; /* -Z option. */
/* When on, print -0.0 if neg zero */
/* When off, print 0.0 if neg zero */
int pad[10]; /* Pad space for future expansion */
} assign_info;
typedef struct {
unsigned I: 1; /* -I option */
unsigned O: 1; /* -O option */
unsigned R: 1; /* -R option */
unsigned V: 1; /* -V option */
unsigned v: 1; /* -v option (command only) */
unsigned z: 1; /* -z option (command only) */
int attrs;
} assign_cntl;
typedef struct {
char attrid; /* letter identifying the attribute */
char *str; /* attribute value (text string) */
char *p; /* parsed data (optional) */
} attribute;
/*
* assign_record - this union is used to store assign records internally.
*/
typedef struct {
assign_obj_id id; /* assign object identifier */
char *attr; /* pointer to list of attributes */
} assign_record;
/*
* assign_environment - a set of 0 or more assign_records.
*/
typedef struct {
int rec_cnt; /* Number of assign records in the */
/* assign environment. */
int rec_lim; /* Space allocated for assign */
/* records. */
assign_record *ar; /* Pointer to list of assign_records */
} assign_environment;
/*
* aenv_stack - a stack of 0 or more assign_environments.
*/
typedef struct {
assign_environment *env; /* contiguous list of env's */
long size; /* number of env's in stack */
} aenv_stack;
typedef struct {
int iotype; /* AE_FORTIO, AE_FFIO */
union {
struct {
char access; /* 's' or 'd' */
char form; /* 'f' or 'u' */
} fortio;
/* other types can be added here */
} u;
} aio_desc;
/*
* tok_list - identifies a list of valid option values and the
* corresponding internal code value which corresponds
* to it.
*/
typedef struct tok_list_s {
char *str;
int code;
} tok_list;
/*
* opt_table - identifies the location in the assign info
* structure where data is stored for an assign option.
* It also points to the tok_list for this option.
*/
typedef struct opt_table_s {
int flg_off;
int val_off;
tok_list *tl;
} opt_table;
/*
* parse_info - contains information for parsing all supported assign
* attribute options.
*/
typedef struct parse_info_s {
char *optname; /* option name ("-b", "-T") */
int flg_off; /* location of opt flag bit */
int val_off; /* location of opt value field */
int (* pfunc)(); /* option value parsing function */
tok_list *tl; /* list of valid tokens if applicable */
unsigned sup: 1; /* 1 if supported on this system */
char *desc; /* displayed usage string */
} parse_info;
/************************************************************************
* *
* EXTERNS AND PROTOTYPES *
* *
************************************************************************/
extern aenv_stack _Ae_env_stack;
extern int _Ae_asgcmd;
extern int _Ae_assign_cmd;
#ifndef _CRAYMPP
EXTERN_LOCK(_Ae_assign_lock)
#else
EXTERN_MPP_LOCK(_Ae_assign_lock)
#endif
extern char _Ae_letters[];
extern parse_info _Ae_option_parse_info[];
extern char *_ae_build_envstring(assign_environment *aep);
extern void _ae_dealloc_env(assign_environment *aep);
extern void _ae_dealloc_recflds(assign_record *arp);
extern int _ae_externalize(int fromwhere, FILE *gfile,
assign_environment *ap);
extern int _ae_externalize_file(FILE *gfile, assign_environment *ap);
extern int _ae_externalize_env(int fromwhere, assign_environment *ap);
extern int _ae_glob_code(char *str);
extern char *_ae_glob_str(int ga);
extern int _ae_insert(assign_obj_id *aoidp, char *attr, int attrlen,
assign_environment *aep);
extern int _ae_internalize(FILE *gfile, assign_environment *aep);
extern int _ae_internalize_file(FILE *gfile, assign_environment *aep);
extern int _ae_internalize_env(assign_environment *aep, int ifasgcmd);
extern int _ae_match_pattern(const char *fname, assign_record **arpp,
assign_environment *aep);
extern int _ae_select(assign_obj_id *aoidp, assign_record **arpp,
assign_environment *aep);
extern void _ae_setupenv(assign_environment *aep);
extern char *_ae_glob_name(int ga);
extern int _asndir_split(char *buf, char **options, char **object,
int ifasgcmd);
extern int _assign(char *opt_string, assign_obj_id *aop, int errmode);
extern int _assign_asgcmd_info(const char *fname, unum_t unum, int gamask,
assign_info *aip, char **atstr, int catcherr);
extern FILE *_gae_open(char acc_mode, char res_mode, int *status);
extern void _gae_close(FILE *f);
extern int _get_a_options(int ifasgcmd, const char *fname, unum_t unum,
int gamask, assign_info *aip, char **atstr,
int errmode);
extern char *_lae_get_assign_file_name(int *estat);
extern char *_lae_get_assign_var_name(void);
extern int _lae_get_object(char *objtext, assign_obj_id *aoidp);
extern int _patmatch(const char *str, const char *pat);
extern void _unique_close(FILE *f);
extern FILE *_unique_open(char *fname, char mode, int *ostat);
extern int _lae_do_assign(int fromwhere, int assign_mode, char open_mode,
char res_mode, assign_obj_id *aoidp,
char *attr_string, int optcheck, int errmode);
extern int _lae_assign_mode(int fromwhere, assign_cntl *cnp, int numobj,
int *amode, char *omode, char *rmode);
extern int _attrs_used(assign_info *aip, char **attrstr);
extern void _attr_clear_used(assign_info *aip);
extern int _ae_eclipse(char *attr1, int len1, char *attr2, int len2,
char **newarp);
extern int _ae_parse(assign_obj_id *aiodp, char *attr, int attrlen,
assign_info *aip, int warnmode, int errmode);
extern int _lae_process_opts(char *opt_string, char **attr_string,
assign_cntl *cntlp);
extern int _ae_delete(assign_record *arp, assign_environment *aep);
extern void _lae_print_record(assign_record *arp);
extern int _ae_next(assign_record *prev, assign_record **next,
assign_environment *aep);
extern int _ae_check_attr(assign_info *ai, int warnmode, int errmode);
extern void _ae_setoflags(assign_info *aip, int *flagmask);
#endif /* !_CRAY_ASSIGN_H */